import java.util.Scanner;

/**
 * 建立一个Java抽象类Drink 应当
 * a、声明一个抽象方法taste() 该方法负责输出饮料的味道
 * b、声明int型常量来代表不同的饮料类型 咖啡、啤酒、牛奶
 * 如 c、声明方法getDrink(int drinkType)
 * 根据传入的参数创建不同的饮料对象 并返回该对象 建议使用switch语句。
 * 该方法要求声明DrinkNotFoundException 当没有相对应的饮料类型时
 * 抛出该异常。
 * 2、建立Drink的具体子类
 * a、分别建立Drink的子类 Coffee 代表咖啡 Beer 代表啤酒 Milk 代表牛奶 ;
 * b、实现taste()方法 要求在控制台打印各自的味道特征。
 * 3、建立异常类DrinkNotFoundException
 * a、继承Exception
 * b、在Drink的 方 法getDrink(int drinkType)中 声 明 引 发DrinkNotFoundException异常 当传入的参数没有相对应的饮料类型时 抛出异常。 c、在使用getDrink方法的类中捕捉该异常。
 * 4、建立Test测试类 测试以上内容的正确性
 * a、编写main方法 通过命令行传参的方式传入某种饮料的类型。 b、在main方法中 调用Drink类的getDrink方法 获得相应的饮料对象。注意捕获DrinkNotFoundException。 c、然后调用该饮料对象的taste()方法 输出该饮料的味道
 * @author zyj
 * @date 2022年05月17日 11:35
 */
public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入饮料的类型（1-3）");

        try {
            Drink drink = Drink.getDrink(sc.nextInt());
            drink.taste();
        } catch (DrinkNotFoundException e) {
            e.printStackTrace();
        }
    }
}

abstract class Drink{
    //定义抽象方法
    public abstract void taste();

    public static Drink getDrink(int drinkType) throws DrinkNotFoundException {
        switch (DrinkType.of(drinkType)){
            case COFFEE:
                return new Coffee();
            case BEER:
               return new Beer();
            case MILK:
               return new Milk();
            default:
                throw new DrinkNotFoundException("没有该饮料");
        }
    }

}

class Coffee extends Drink{
    @Override
    public void taste() {
        System.out.println("这是一杯咖啡，喝起来有点苦");
    }
}

class Beer extends Drink{

    @Override
    public void taste() {
        System.out.println("这是杯啤酒，喝起来有点飘");
    }
}

class Milk extends Drink{

    @Override
    public void taste() {
        System.out.println("这是一杯牛奶，喝起来有点香甜");
    }
}

enum DrinkType{
    COFFEE,BEER,MILK;
    private static final DrinkType[] ENUMS = DrinkType.values();
    public static DrinkType of(int drinkType) throws DrinkNotFoundException {
        if (drinkType < 1 || drinkType > 3) {
            throw new DrinkNotFoundException("没有该饮料");
        }
        return ENUMS[drinkType - 1];
    }
}

class DrinkNotFoundException extends Exception{
    public DrinkNotFoundException(String message){
        super(message);
    }
}